home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / zako033.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  162 lines

  1. /* 4面で登場する止まって撃っていれば当たらないザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15. #define SPEED_1        4    /* 速度 */
  16. #define    SPEED_2        6    /* 2段階目の速度 */
  17.  
  18.  
  19.  
  20. static short points_disp;    /* 得点を表示するか */
  21.  
  22. static short EnemyMoveZako033 (ENEMY *);
  23. static void EnemyTiniZako033 (ENEMY *);
  24.  
  25.  
  26. /* ゲーム開始時に1回だけ呼ばれる */
  27. void EnemyInitStaticZako033 (void)
  28. {
  29.     points_disp = 0;
  30. }
  31.  
  32.  
  33.  
  34. void EnemyInitZako033 (ENEMY * p)
  35. {
  36.     p->angle = psearch (SHORT_LX, SHORT_LY);
  37.     p->vx = vxtable[SPEED_1][p->angle];
  38.     p->vy = vytable[SPEED_1][p->angle];
  39.     p->pt = obj_zako02;
  40.     p->hit_px = 12;
  41.     p->hit_py = 12;
  42.     p->hit_sx = 12;
  43.     p->hit_sy = 12;
  44.     p->hit_cx = 8;
  45.     p->damage = p->damage_core = 0;
  46.     p->hp = 1;
  47.     p->seq = 0;
  48.     p->m_work = 0;
  49.     p->pt = obj_zako03 + 2;
  50.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  51.     p->core_pt = sp_core01;
  52.     p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  53.  
  54.     p->func_enemy_move = EnemyMoveZako033;
  55.     p->func_enemy_tini = EnemyTiniZako033;
  56. }
  57.  
  58.  
  59.  
  60. static short EnemyMoveZako033 (ENEMY * p)
  61. {
  62.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  63.     p->x = (p->lx += p->vx) >> 16;
  64.     p->y = (p->ly += p->vy) >> 16;
  65.  
  66.     switch (p->seq) {
  67.     case 0:
  68.         if (p->m_work++ > 30) {
  69.             p->seq++;
  70.             p->s_work = p->s_work2 = p->s_work3 = 0;
  71.         }
  72.         break;
  73.  
  74.         /* 攻撃開始 */
  75.     case 1:
  76.         switch (p->s_work) {
  77.  
  78.         case 0:    /* 2-Way ショット */
  79. #define INTERVAL1_0        16
  80. #define SPEED_SHOT1_0    12
  81.             if (p->s_work2++ > INTERVAL1_0) {
  82.                 p->s_work2 = 0;
  83.                 if (p->s_work3++ < 3) {
  84.                     char a = psearch (SHORT_LX, SHORT_LY);
  85.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_0, a - 8, 0);
  86.                     EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_0, a + 8, 0);
  87.                     SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  88.                 } else {
  89.                     p->s_work++;
  90.                     p->s_work3 = 0;
  91.                     p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;    /* 赤くなる */
  92.                 }
  93.             }
  94.             break;
  95.  
  96.         case 1:    /* 3-Way ショット */
  97. #define INTERVAL1_1        15
  98. #define SPEED_SHOT1_1    18
  99.             if (p->s_work2++ > INTERVAL1_1) {
  100.                 p->s_work2 = 0;
  101.                 if (p->s_work3++ < 2) {
  102.                     char a = psearch (SHORT_LX, SHORT_LY);
  103.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a - 8, 0);
  104.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a, 0);
  105.                     EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a + 8, 0);
  106.                     SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  107.                 } else {
  108.                     p->seq++;
  109.                     p->vx = vxtable[SPEED_2][p->angle];
  110.                     p->vy = vytable[SPEED_2][p->angle];
  111.                 }
  112.             }
  113.             break;
  114.         }
  115.         break;
  116.  
  117.     case 2:        /* 逃げる */
  118.         /* 画面外に出たら消去 */
  119.         /* (画面左右から出た判定と上下から出た判定を1回ずつの比較で行っている) */
  120.         if (((unsigned short) p->x > 256 + 32) || ((unsigned short) p->y > 256 + 32))
  121.             return (-1);    /* 消去 */
  122.         break;
  123.  
  124.     default:
  125.         break;
  126.     }
  127.  
  128.     /* 自機ショットに当たった時の処理 */
  129.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  130.     if (p->damage) {
  131.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  132.         SoundSetSE (SE_EXPL);
  133.         if (points_disp < ZAKO_SCORE_DISP) {
  134.             points_disp++;
  135.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  136.                 EffectInit (EFFECT_POINTS_RED, POINTS_500, p->x, p->y);
  137.             else
  138.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_100, p->x, p->y);
  139.         } else {
  140.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  141.                 EffectInit (EFFECT_POINTS, POINTS_500, p->x, p->y);
  142.             else
  143.                 EffectInit (EFFECT_POINTS, POINTS_100, p->x, p->y);
  144.         }
  145.         return (-1);    /* 消去 */
  146.     }
  147.     xobj_set_st (p);
  148.  
  149.     /* コアの表示 */
  150.     p->core_x = p->x - 8;
  151.     p->core_y = p->y - 8;
  152.     xsp_set_st (&(p->core_x));
  153.  
  154.     return (0);
  155. }
  156.  
  157.  
  158.  
  159. static void EnemyTiniZako033 (ENEMY * p)
  160. {
  161. }
  162.